home *** CD-ROM | disk | FTP | other *** search
/ Ultimate Screensaver / Ultimate Screen Savers Collection (CMS Distributing) (1996).ISO / saver3 / xwsave1 / ssclass.cpp < prev    next >
C/C++ Source or Header  |  1995-03-01  |  5KB  |  177 lines

  1. /* //////////////////////////////////////////////////////////////////////
  2.  
  3.   Module:   ssclass.cpp - A simple screen saver class for building Microsoft
  4.                           Windows screen savers.
  5.  
  6.   Author:   Perry K. Sloope
  7.  
  8.   Copyright (c) 1995 Perry K. Sloope
  9.  
  10.   Permission to use, copy, modify, and distribute this software and its
  11.   documentation for any purpose and without fee is hereby granted,
  12.   provided that the above copyright notice appear in all copies and that
  13.   both that copyright notice and this permission notice appear in
  14.   supporting documentation.
  15.  
  16.   This file is provided AS IS with no warranties of any kind.  The author
  17.   shall have no liability with respect to the infringement of copyrights,
  18.   trade secrets or any patents by this file or any part thereof.  In no
  19.   event will the author be liable for any lost revenue or profits or
  20.   other special, indirect and consequential damages.
  21.  
  22.   Comments and additions should be sent to the author:
  23.  
  24.               sloope@blkbox.com  or
  25.               Compuserve 71234,3632
  26.  
  27.   Useage:  See ssclass.h for instructions.  See xwinsaver.cpp for an example
  28.            on using the class.
  29.  
  30.   This was built and compiled using Borland 4.5 C++.  However I tried to design
  31.   the code so that it was independent of the compiler.  It should be possible
  32.   to compile this using any C++ compiler that can produce MS Windows 3.1
  33.   executables.  No special library files or dlls are required other than
  34.   those needed to build any MS Windows program.
  35.  
  36. //////////////////////////////////////////////////////////////////////////  */
  37. #ifdef _WIN32
  38. #define STRICK
  39. #endif
  40. #include <windows.h>
  41. #include <string.h>
  42. #include <ctype.h>
  43. #include "ssclass.hpp"
  44.  
  45.  
  46. ScreenSave::ScreenSave(char *AppNm, HANDLE hInst, HANDLE hPrevInst,
  47.                        LPSTR CmdLine, int CmdShow)
  48. {
  49.    AppName = new char[strlen(AppNm)+1];
  50.    strcpy(AppName,AppNm);
  51.    hInstance = hInst;
  52.    hPrevInstance = hPrevInst;
  53.    lpszCmdLine = CmdLine;
  54.    nCmdShow = CmdShow;
  55.    pConfigDlg = NULL;
  56.    DlgName = NULL;
  57. }
  58.  
  59.  
  60.  
  61. int ScreenSave::ShowConfig(char *DlgName)
  62. {
  63.      static FARPROC ConfigDlgProc;
  64.  
  65.      if (pConfigDlg == NULL)
  66.         return FALSE;
  67.      ConfigDlgProc = MakeProcInstance ((FARPROC)pConfigDlg, hInstance);
  68.      DialogBox (hInstance, DlgName, NULL, ConfigDlgProc);
  69.      return TRUE;
  70. }
  71.  
  72.  
  73. char ScreenSave::GetCmdLine()
  74. {
  75.     char cmdarg = toupper(lpszCmdLine[0]);
  76.     if((cmdarg == '/') || (cmdarg == '-'))
  77.         cmdarg = toupper(lpszCmdLine[1]);
  78.     return cmdarg;
  79. }
  80.  
  81.  
  82.  
  83. LONG FAR PASCAL _export ScrnSavProc (HWND hwnd, UINT message,
  84.                                                  UINT wParam, LONG lParam)
  85. {
  86.      static firsttime = 1;
  87.      switch (message)
  88.      {
  89.           case WM_SIZE:
  90. //               cxClient = LOWORD (lParam) ;
  91. //               cyClient = HIWORD (lParam) ;
  92.                return 0 ;
  93.           case WM_ACTIVATE:
  94.           case WM_ACTIVATEAPP:
  95.                if ( wParam != 0 )
  96.                    break;
  97.  
  98.           case WM_MOUSEMOVE:
  99.           case WM_KEYDOWN:
  100.           case WM_KEYUP:
  101.           case WM_SYSKEYDOWN:
  102.           case WM_LBUTTONDOWN:
  103.           case WM_MBUTTONDOWN:
  104.           case WM_RBUTTONDOWN:
  105.              if (firsttime)
  106.                firsttime = 0;
  107.              else
  108.                PostMessage(hwnd, WM_CLOSE, 0, 0L);
  109.              break;
  110.           case WM_DESTROY:
  111.                PostQuitMessage (0) ;
  112.                return 0 ;
  113.       }
  114.       return DefWindowProc (hwnd, message, wParam, lParam) ;
  115. }
  116.  
  117.  
  118.  
  119.  
  120. int ScreenSave::RunScreenSaver()
  121. {
  122.      MSG msg;
  123.  
  124.      if(GetCmdLine() != 'S')
  125.      {
  126.         if (ShowConfig(DlgName))
  127.           return TRUE;
  128.      }
  129.  
  130.      if (!hPrevInstance)
  131.      {
  132.           wndclass.style         = CS_HREDRAW | CS_VREDRAW | CS_SAVEBITS;
  133.           wndclass.lpfnWndProc   = ::ScrnSavProc;
  134.           wndclass.cbClsExtra    = 0;
  135.           wndclass.cbWndExtra    = 0;
  136.           wndclass.hInstance     = hInstance;
  137.           wndclass.hIcon         = NULL;
  138.           wndclass.hCursor       = NULL; // Don't need no stinking cursor.
  139.           wndclass.hbrBackground = GetStockObject (BLACK_BRUSH);
  140.           wndclass.lpszMenuName  = NULL;
  141.           wndclass.lpszClassName = AppName;
  142.  
  143.           RegisterClass (&wndclass);
  144.      }
  145.  
  146.      hWnd = CreateWindowEx (WS_EX_TOPMOST,AppName, "",
  147.                           WS_MAXIMIZE | WS_POPUP,
  148.                           0,0,GetSystemMetrics(SM_CXSCREEN),
  149.                           GetSystemMetrics(SM_CYSCREEN),
  150.                           NULL, NULL, hInstance, NULL);
  151.  
  152.      ShowWindow (hWnd, nCmdShow);
  153.      UpdateWindow (hWnd);
  154.      while (ShowCursor(FALSE) >= 0);  // Hide cursor.
  155.      hdc = CreateDC("DISPLAY",NULL,NULL,NULL);
  156.      InitSS();
  157.      for(;;)
  158.      {
  159.          if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
  160.          {
  161.              if (msg.message == WM_QUIT)
  162.                   break ;
  163.  
  164.              TranslateMessage (&msg) ;
  165.              DispatchMessage (&msg) ;
  166.          }
  167.          else
  168.          {
  169.             ShowScreenSaver();
  170.          }
  171.      }
  172.      DeleteDC (hdc);
  173.      while (ShowCursor(TRUE) < 0);
  174.      return msg.wParam ;
  175. }
  176.  
  177.